前情提要
還記得我們之前的 day 10 的文章 手動部署 Python FastAPI demo app in Docker 嗎?
我們今天要寫一支最簡單的 playbook 來進行遠端部署,
先看一下目錄結構
.
├── ansible.cfg
├── inventory
├── main.yml
└── roles
├── build_fastapi
│ └── tasks
│ └── main.yml
└── hello_world
├── tasks
│ └── main.yml
└── vars
└── main.yml
很顯然我們今天新增 roles/build_fastapi/tasks/main.yml
,
它做什麼事?還記得我們 day2 的文章Simple Build Flow 的系統架構嗎?
軟體自動化的底層邏輯其實就是五拍子
- incoming request: 某個人通知你要做某件事
- pull resources: 到處拉 repo 拉 config
- build artifacts: 把 code 編成各種 binary,把參數結合各種模板揉成各種 config
- push results: 把各種 output 推到該去的地方,不管是 code、config、binary...etc
- notify status: 不管結果如何,由機器通知到負責管理的人
然後我們又提到,
第一步是 Ansible AWX 要做的,
今天要做第二至四步,
至於第五步,我們先在 console 上 parse 出執行結果,
結果的本身其實有很多種方法通知以後再細說
真的進行 playbook 的編寫之前,
我們先改一個檔案,最外層的 mail.yml
---
- name: main task
hosts: staging
vars:
build_root_abspath: "/home/ubuntu/build/{{ ansible_date_time.iso8601_basic_short }}"
demobackend_version: "latest"
roles:
- role: build_fastapi
這邊新增了兩個全域的參數
build_root_abspath
: 代表每次執行 build flow/CI jobs 的時候,在遠端機器的暫存目錄demobackend_version
: 代表我們 backend api 這次要部署的版本等等我們會在 roles/build_fastapi
來使用,
之所以開成全域參數,
是因為今天為了 demo 方便,
把拉 code、編 code、部署…etc 通通寫在同一支 playbook,
正常來說應該要切開,
原因是有些工作可能可以平行做,像是編好幾個 docker,
這時候最好拆成不同 playbook 來執行,
而不會像 demo 這樣全部寫在一起
接著就是今天的 playbook: roles/build_fastapi/tasks/main.yml
---
- name: show remote host
debug:
msg: "the remote server is {{ ansible_host }}"
- name: create build dir if not exists
file:
path: "{{ build_root_abspath }}"
state: directory
- name: git clone
git:
repo: "git@github.com:yiidtw/ironman2023-demo-fastapi.git"
dest: "{{ build_root_abspath }}"
remote: "origin"
version: "main"
- name: build docker
community.docker.docker_image:
name: ironman2023-fastapi
build:
path: "{{ build_root_abspath }}"
tag: "{{ demobackend_version }}"
source: build
- name: run docker
docker_container:
name: demobackend
state: started
recreate: yes
image: "ironman2023-fastapi:{{ demobackend_version }}"
ports:
- "8080:8080"
- name: wait for the api ready
wait_for:
host: 0.0.0.0
port: 8080
delay: 10
- name: testing api locally
shell: "curl -k localhost:8080"
register: reg_curl_result
- name: show curl result
debug:
msg: "{{ reg_curl_result.stdout }}"
我們先來看一下執行結果,
明天再來解釋